Exemple CNC 10 : Programmation de trajectoires CNC dynamiques
Voir le CNC10_DynamicPath.project exemple de projet dans le répertoire d'installation de CODESYS en dessous de ..\CODESYS SoftMotion\Examples.
Cet exemple montre comment un chemin CNC peut être créé directement dans l'application au moment de l'exécution - sans être alimenté avec du code G à partir d'un objet de programme CNC ou d'un fichier. Lorsque ce type de programme CNC conventionnel est compilé, les données de chemin sont stockées dans un SMC_CNC_Data type de structure de données. Ces données internes sont ensuite compilées dans des structures de données globales spécifiques selon le mode de compilation (SMC_CNC_REF ou SMC_OutQueue).
En mode compilation SMC_CNC_REF, les données sont stockées dans un tableau de SMC_GEOINFO éléments. Le tableau dans le code de l'application est généralement transmis à l'instance du bloc fonction SMC_NCDecoder. A l'exécution, les données y sont décodées et stockées dans une structure de données globale de type SMC_OUTQUEUE. Ensuite, les blocs fonctionnels de prétraitement de chemin peuvent être appelés.
En mode compilation SMC_OutQueue, une structure de données globale (SMC_OUTQUEUE) est généré directement. Cette structure de données dans le code de l'application est transmise à l'interpolateur (SMC_Interpolator instance FB). Le bloc fonction SMC_NCDecoder ne s'appelle pas.
En mode compilation DÉPOSER, les données sont stockées dans un fichier. Les données sont stockées sous la forme d'un tableau d'éléments de type SMC_GEOINFO et correspondent aux données générées en mode compilation SMC_CNC_REF.
Au lieu de programmer le chemin CNC, vous pouvez programmer un code d'application qui instancie une structure de données de type SMC_OUTQUEUE au moment de l'exécution et attribue ses valeurs. Vous programmez une trajectoire CNC qui est générée dynamiquement lors de l'exécution. Vous pouvez transmettre la structure de données à d'autres instances de blocs fonctionnels (par exemple aux blocs fonctionnels de prétraitement de chemin ou au bloc fonctionnel SMC_Interpolator).
La programmation
Astuce
le CNCDynamicPath exemple de projet se trouve dans le répertoire d'installation de CODESYS. L'exemple de projet a été élaboré à partir du CNConline projet. Il comprend le Path programme au lieu de la programmation graphique Example chemin. Une structure de données de type SMC_OUTQUEUE est généré dynamiquement.
Déclarer une structure de données de type
SMC_OUTQUEUE. La structure de données contient les données de trajectoire CNC et est renseignée dynamiquement.Exemple:
QUEUEAllouez de la mémoire pour le chemin avec la quantité requise pour
SMC_GEOINFOéléments.Exemple:
BUFDéclarer une variable de type
SMC_GEOINFOavec une première étape.Exemple:
GEO
Un élément de tableau de type de données
SMC_GEOINFOcorrespond à un élément de chemin dans le code CNC. Les étapes suivantes doivent être effectuées pour chaque élément afin d'ajouter l'élément auSMC_OUTQUEUE:Chaque élément de tableau a une position de début qui correspond à la position de fin de l'élément de tableau précédent.
Exemple:
GEO.piStartPos.dX := 0;ouGEO.piStartPos := GEO.piDestPos;Déterminez un type de mouvement pour chaque élément du tableau.
Exemple:
GEO.iMoveType := CCLW;ouGEO.iMoveType := LIN;Définissez les paramètres du type de mouvement. Ceci n'est pas obligatoire pour tous les types de mouvement.
Exemple : Pour un arc (type de mouvement : CCLW), le réglage des positions suivantes est requis :
geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;Insérez le calcul de la position finale.
SMC_CalcEndPnt(ADR(GEO));Insérez le calcul de la longueur de l'objet.
SMC_CalcLengthGeo(ADR(GEO));Enregistrez l'objet dans
QUEUE:SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));
Lorsque le chemin est entièrement créé, les marqueurs de fin doivent être définis : QUEUE.bEndOfList := TRUE;
Astuce
Ensuite, lorsqu'un bloc fonction de prétraitement de chemin est appelé, il est nécessaire de définir le bit de début ou de fin pour InternMark.
Chemin CNC avec deux éléments de chemin
Dans cet exemple, les tableaux ne sont pas définis avec les positions X/Y. S'il s'agissait d'un exemple avec deux éléments de chemin comme décrit, alors ces tableaux devraient avoir deux éléments chacun.
Par exemple, dérivé de l'exemple de projet :
xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path
VAR
iState : INT;
QUEUE : SMC_OUTQUEUE;
BUF : ARRAY[0..49] OF SMC_GEOINFO;
// Memory allocation
GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0);
// Initial path element
n : INT := 0;
QUEUE.nSize := SIZEOF(BUF);
END_VAR
CASE iState OF
0:
QUEUE.pbyBuffer := ADR(BUF[0]);
// Initialize QUEUE
SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF));
iState := iState + 1;
1:
// Fill QUEUE
WHILE NOT QUEUE.bFull DO
// When QUEUE is full, wait until it has been processed by the following FBs
n := n + 1;
GEO.iSourceLine_No := n;
GEO.piStartPos := GEO.piDestPos;
// Copying last destination
GEO.iMoveType := LIN;
// Generating linear movement
GEO.iObjNo := GEO.iObjNo + 1;
// Calculating number
GEO.piDestPos.dX := xp[n];
// Generatint position
GEO.piDestPos.dY := yp[n];
SMC_CalcLengthGeo(pg := ADR(GEO));
// Calculating length of object with the help of the standard function
SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO));
// Appending object to QUEUE
IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN
// All target positions processed
QUEUE.bEndOfList := TRUE;
n := 0;
iState := 2;
EXIT;
END_IF
END_WHILE
2:
//Done
;
END_CASE
CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // PreprocessingImportant
Si la SMC_OUTQUEUE la structure de données est remplie avec SMC_GEOINFO data et l'élément de structure de données a été défini sur bFULL = TRUE, alors nous ne recommandons pas une autre affectation de SMC_GEOINFO Les données. Dans ce cas, la création du chemin est interrompue à l'exécution jusqu'à ce que le premier élément du SMC_OUTQUEUE la structure des données est traitée dans l'interpolateur. Ce n'est qu'alors qu'un autre élément est inséré.
Évitez cette interruption en allouant suffisamment de mémoire. Voir variable BUF.
Important
Si la structure de données SMC_OUTQUEUE est rechargé après la première exécution, puis l'interpolateur et tous les blocs fonction de prétraitement (exemple : SMC_CheckVelocities) doivent être redémarrés par un front montant à Execute.